Work performed by modern computer systems may be considered to fall into two categories: (1) production work which is directly related to the users or purpose of the system; and (2) other work, such as tasks that are less important or those that are essential to the long-term functioning and health of the system. Non-production work in this context includes utilities, low priority applications, low priority functions within an application, and also low priority users using the system, for example, a user generating a mining report in a database application. For convenience, in the rest of this document, non-production work is referred to as “utility work”. Some examples of utility work include garbage collection, running anti-virus software, performing system backups, etc. Utility work is usually considered to be lower-priority when resolving contention for resources, such as CPU, memory, bandwidth, etc. Unfortunately, resource prioritization schemes in modern operating systems do not fully address the issue of arbitrating resource contention. For example, Unix systems allow process priorities to control CPU contention, but contention for other resources, e.g. I/O, memory, etc., are not arbitrated. Hence, the execution of non-production work on a well-utilized system will generally degrade the performance of the production work due to such contention and other overheads introduced by running the utilities.
One approach to overcome the foregoing problems is for the system administrator to carefully plan the execution of utility work during periods when the production work is low or when the system is offline. This approach is problematic because: (a) it requires a large expenditure of time and effort of the system administrator; (b) not all utilities can be deferred until such a period; (c) the window of execution may be too short for the utility to complete its tasks or perform its tasks properly; and (d) in modern 24×7 operation, such low or offline periods may be absent.
Another approach is to “throttle” utility work to a variable extent. In the context of this work, throttling refers to a lowering of the utility's rate of progress or resource consumption. For example, one may limit the rate at which memory is scanned by a garbage collector, or the I/O bandwidth consumed by a system backup. By throttling utilities to a larger extent, a system administrator may limit the impact of utilities on production work, thereby allowing the system administrator to run the utility along with production work.
A drawback of the throttling approach described above is that the progress of utility work may be unnecessarily impacted, if the throttling level is too high when the production low is low. System administrators have generally competing objectives: (1) ensuring that utilities are throttled sufficiently to prevent undue impact on production work; and (2) ensuring that managed systems are well utilized and/or that utilities finish within an acceptable time. The workload of most commercial systems varies with time, thus it is desirable to change the throttling level in response to changing workloads to optimize system resource allocation. When the production load is high the utilities should be throttled more, but when production load is low the utilities should be throttled less. Moreover, utilities which have little or no impact on the production work may not need to be throttled much or at all. However, manually adjusting throttling levels to the appropriate level is labor-intensive and error-prone, thereby raising the costs of ownership of the system.
In view of these shortcomings, there exists a need for automatically controlling the rate of execution of non-production work in a computer system.